/**
  ******************************************************************************
  * @文件名称 : wiip_list.c
  * @摘要 : 
  * @创建日期 : Aug 27, 2024
  * @创建者：Edward
  ******************************************************************************
  * @使用说明
  *
  *  
  ******************************************************************************
  */

/* 声明包含头文件 -----------------------------------------------------------*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wiip_list.h"
/* 声明私有类型定义---------------------------------------------------------*/

/* 声明私有变量 -------------------------------------------------------------*/

/* 声明私有常量 -------------------------------------------------------------*/

/* 声明私有宏定义 -----------------------------------------------------------*/

/* 声明私有函数 -------------------------------------------------------------*/
/**
	* 函 数 名： 
	* 功能说明： 
	* 入口参数： 
	* 返 回 值： 
	*/
/* 申请动态空间,创建信息记录节点 */
static listNode_t * _createNode(info_t info)
{
	listNode_t * newNode = (listNode_t *)malloc(sizeof(listNode_t));/* 申请动态空间 */
	if(newNode)/* 申请空间地址有效 */
	{
		newNode->record = info;/* 将信息内容进行记录 */
		newNode->next = NULL;/* 下一个节点赋值为空 */
		return newNode;
	}
	return NULL;
}
/* 在列表头部增加记录节点 */
uint8_t list_addHeadNode(listNode_t ** head, info_t info)
{
	listNode_t * newNode = _createNode(info);/* 申请动态空间,创建记录节点 */
	if(newNode == NULL)
		return 0;
	/* 如果链表为空，则将新节点设置为头节点，并返回 */
	if(*head == NULL)
	{
		*head = newNode;
	}
	/* 如果链表不为空 */
	else
	{
		newNode->next = *head;/* 将新节点的 next 指针指向当前链表的头节点 */
		*head = newNode;/* 将新节点设置为链表的新头节点 */
	}
	return 1;
}
/* 在列表尾部增加记录节点 */
uint8_t list_addTailNode(listNode_t ** head, info_t info)
{
	listNode_t * newNode = _createNode(info);/* 申请动态空间,创建记录节点 */
	listNode_t * posNode = (*head);
	if(newNode == NULL)
		return 0;
	if(*head == NULL)
	{
		*head = newNode;
		return 1;
	}
	while(posNode->next)
	{
		posNode = posNode->next;
	}
	posNode->next = newNode;
	return 1;
}
/* 在列表尾部删除记录节点 */
uint8_t list_delTailNode(listNode_t ** head)
{
	if(*head == NULL)/* 如果链表为空,退出并返回错误码 */
		return 0;
	listNode_t * nowNode = *head;
	listNode_t * lastNode = NULL;

	while(nowNode->next)/* 遍历查找链表下一个节点不为空的节点 */
	{
		lastNode = nowNode;
		nowNode = nowNode->next;
	}

	if(lastNode == NULL)/* 如果头节点的下一个节点为空 */
	{
		*head = NULL;/* 头节点指向地址清零 */
	}
	else
	{
		lastNode->next = NULL;
	}

	free(nowNode);/* 释放此节点占用空间 */
	return 1;
}
/* 在列表中间删除指定的信息记录节点 */
uint8_t list_delMiddNode(listNode_t ** head, uint16_t id)
{
	listNode_t * lastNode = *head;
	listNode_t * nowNode = *head;
	/* 遍历查找指定的信息节点 */
	while(nowNode->record.id != id)
	{
		if(nowNode->next == NULL)
			return 0;
		lastNode = nowNode;
		nowNode	= nowNode->next;
	}
	/* 如果不是第一个节点，修改上一个节点的指向，指向到下一个节点 */
	if(nowNode != lastNode)
	{
		lastNode->next = nowNode->next;
	}
	else
	{
		* head = nowNode->next;
	}
	/* 最后释放指定节点的空间 */
	free(nowNode);
	return 1;
}
/* 在列表中查找指定的信息记录节点并修改 */
uint8_t list_editNodeByID(listNode_t ** head, uint16_t ID, info_t editNode)
{
	listNode_t * nowNode = *head;
	if(nowNode == NULL)
		return 0;
	while(nowNode->record.id != ID)
	{
		if(nowNode->next == NULL)
			return 0;
		nowNode = nowNode->next;
	}
	(*nowNode).record = editNode;
	return 1;
}
/* 在列表中查找指定的信息记录节点 */
uint8_t list_findNodeBySN(listNode_t ** head, uint16_t SN, listNode_t ** targetNode)
{
	listNode_t * nowNode = *head;
	if(nowNode == NULL)
		return 0;
	while(SN--)
	{
		if(nowNode->next == NULL)
			return 0;
		nowNode = nowNode->next;
	}
	*targetNode = nowNode;
	return 1;
}
/**************** (C) COPYRIGHT EdwardYang *************END OF FILE****/


